package cn.wolfcode.business.service.impl;

import java.math.BigDecimal;
import java.util.List;

import cn.wolfcode.business.domain.BusAppointment;
import cn.wolfcode.business.domain.BusStatement;
import cn.wolfcode.business.dto.StatementDTO;
import cn.wolfcode.business.mapper.BusAppointmentMapper;
import cn.wolfcode.business.mapper.BusStatementMapper;
import cn.wolfcode.common.constant.BusinessConstants;
import cn.wolfcode.common.utils.DateUtils;
import cn.wolfcode.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import cn.wolfcode.business.mapper.BusStatementItemMapper;
import cn.wolfcode.business.domain.BusStatementItem;
import cn.wolfcode.business.service.IBusStatementItemService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 结算单明细Service业务层处理
 * 
 * @author zhangyf
 * @date 2023-04-14
 */
@Service
public class BusStatementItemServiceImpl implements IBusStatementItemService 
{
    @Autowired
    private BusStatementItemMapper busStatementItemMapper;
    @Autowired
    private BusStatementMapper busStatementMapper;
    @Autowired
    private BusAppointmentMapper busAppointmentMapper;


    /**
     * 查询结算单明细
     * 
     * @param id 结算单明细主键
     * @return 结算单明细
     */
    @Override
    public BusStatementItem selectBusStatementItemById(Long id)
    {
        return busStatementItemMapper.selectBusStatementItemById(id);
    }

    /**
     * 查询结算单明细列表
     * 
     * @param busStatementItem 结算单明细
     * @return 结算单明细
     */
    @Override
    public List<BusStatementItem> selectBusStatementItemList(BusStatementItem busStatementItem)
    {
        return busStatementItemMapper.selectBusStatementItemList(busStatementItem);
    }

    /**
     * 新增结算单明细
     * 
     * @param busStatementItem 结算单明细
     * @return 结果
     */
    @Override
    public int insertBusStatementItem(BusStatementItem busStatementItem)
    {
        return busStatementItemMapper.insertBusStatementItem(busStatementItem);
    }

    /**
     * 修改结算单明细
     * 
     * @param busStatementItem 结算单明细
     * @return 结果
     */
    @Override
    public int updateBusStatementItem(BusStatementItem busStatementItem)
    {
        return busStatementItemMapper.updateBusStatementItem(busStatementItem);
    }

    /**
     * 批量删除结算单明细
     * 
     * @param ids 需要删除的结算单明细主键
     * @return 结果
     */
    @Override
    public int deleteBusStatementItemByIds(Long[] ids)
    {
        return busStatementItemMapper.deleteBusStatementItemByIds(ids);
    }

    /**
     * 删除结算单明细信息
     * 
     * @param id 结算单明细主键
     * @return 结果
     */
    @Override
    public int deleteBusStatementItemById(Long id)
    {
        return busStatementItemMapper.deleteBusStatementItemById(id);
    }

    @Override
    @Transactional
    public int addStatementItems(StatementDTO statementDTO) {
        // 往结算单明细表存入数据（可能会存多条）
        // 修改结算单数据，计算总金额，总数量
        BusStatement originBusStatement = busStatementMapper.selectBusStatementById(statementDTO.getStatementId());
        saveStatementItems(statementDTO, originBusStatement);
        return busStatementMapper.updateBusStatement(originBusStatement);
    }

    @Override
    @Transactional
    public int payStatement(StatementDTO statementDTO) {
        // 改预约单
        BusStatement originBusStatement = busStatementMapper.selectBusStatementById(statementDTO.getStatementId());
        Long appointmentId = originBusStatement.getAppointmentId();
        if(appointmentId != null){  //通过预约产生结算单
            BusAppointment originBusAppointment = busAppointmentMapper.selectBusAppointmentById(appointmentId);
            originBusAppointment.setStatus(BusinessConstants.APPOINTMENT_STATUS_PAYED);
            busAppointmentMapper.updateBusAppointment(originBusAppointment);
        }

        // 保存明细单
        // 改结算单(还要改支付时间，收款人，还有状态)
        saveStatementItems(statementDTO,originBusStatement);
        originBusStatement.setPayeeId(SecurityUtils.getUserId());
        originBusStatement.setPayTime(DateUtils.getNowDate());
        originBusStatement.setStatus(BusinessConstants.STATEMENT_STATUS_PAYED);
        return busStatementMapper.updateBusStatement(originBusStatement);
    }

    private void saveStatementItems(StatementDTO statementDTO, BusStatement originBusStatement) {
        // 汇总价格
        BigDecimal totalAmount = BigDecimal.ZERO;
        // 汇总数量
        BigDecimal totalQuantity = BigDecimal.ZERO;

        // 传了什么明细，就存什么明细。如果你在原有的基础上减少，增加，不变服务项，就会不断地添加数据，因为永远都是增加。所以先删除以前的结算明细。
        // 以传过来的为准，先去数据这个结算单对应明细
        busStatementItemMapper.deleteBusStatementItemByStatementId(statementDTO.getStatementId());
        for (BusStatementItem busStatementItem : statementDTO.getBusStatementItems()) {
            if (!busStatementItem.getStatementId().equals(statementDTO.getStatementId())) {
                throw new RuntimeException("非法参数");
            }
            busStatementItemMapper.insertBusStatementItem(busStatementItem);
            // 获取数量
            BigDecimal quantity = new BigDecimal(busStatementItem.getItemQuantity());
            // 汇总数量
            totalQuantity = totalQuantity.add(quantity);
            // 汇总价格
            totalAmount = totalAmount.add(busStatementItem.getItemPrice().multiply(quantity));
        }

        originBusStatement.setTotalAmount(totalAmount);
        originBusStatement.setTotalQuantity(totalQuantity);
        originBusStatement.setDiscountAmount(statementDTO.getDiscountPrice());
    }
}
